package com.distributeredis.redis_springboot.springaop;

import com.distributeredis.redis_springboot.springaop.vo.Person;
import com.distributeredis.redis_springboot.springaop.vo.User;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.util.List;

/**
 *      *：单个独立的任意符号，可以独立出现，也可以作为前缀或者后缀的匹配符出现
 *      execution(public * com.itheima.*.UserService.find*(*))  匹配com.itheima包下的任意包中的UserService类或接口中所有find开头的带有一个参数的方法
 *
 *      ..:多个连续的任意符号，可以独立出现，（参数一般使用..)
 *      execution(public User com..UserService.findById(..))  匹配com包下的任意包中的UserService类或接口中所有名称为findById的方法
 *
 */
//@Component
//@Aspect
public class MyLogAspect1 {
    // 设置切入点
    @Pointcut("execution(* com.distributeredis.redis_springboot.springaop.impl.LogServiceImpl.*(..))")
    private void ptt(){}

    @Around("ptt()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        // 通过aop去除空格
        Object[] args = joinPoint.getArgs();
        for (int i = 0; i < args.length; i++) {
            if(args[i].getClass().equals(String.class)) {
                args[i] = args[i].toString().trim();
            }
            if(args[i].getClass().equals(User.class)) {
                User user = (User) args[i];
                // 利用反射去除对象里面的空格
                Class<? extends User> aClass = user.getClass();
                Field[] declaredFields = aClass.getDeclaredFields();
                for (Field declaredField : declaredFields) {
                    // 获取成员变量的名字
                    String name = declaredField.getName();

                    Class<?> type = declaredField.getType();
                    if(type.equals(List.class)) {
                        declaredField.setAccessible(true);
                        List<Person> values = (List<Person>) declaredField.get(user);
                        for (Person person : values) {
                            Class aClass1 = person.getClass();
                            Field[] fields = aClass1.getDeclaredFields();
                            for (Field field : fields) {
                                // 开启暴力反射
                                field.setAccessible(true);
                                String value = (String) field.get(person);
                                String trimValue = value.trim();
                                field.set(person,trimValue);
                            }
                        }
                        System.out.println(values);
                    }else {
                        // 开启暴力反射
                        declaredField.setAccessible(true);
                        String value = (String) declaredField.get(user);
                        String trimValue = value.trim();
                        declaredField.set(user,trimValue);
                    }
                }
            }
        }
        Object proceed = joinPoint.proceed(args);
        return proceed;
    }

}
